﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Caching;
using Com.AlbLab.GEP.Domain.Entities;
using Com.AlbLab.GEP.Services.Base;
using Com.AlbLab.GEP.Cache;
using Com.AlbLab.GEP.Services.Interface;
using Com.AlbLab.GEP.Domain;

namespace Com.AlbLab.GEP.Services.Impl
{
    public class GestioneFasiServices : BaseSingleton<GestioneFasiServices>, IGestioneFasiServices
    {
        const int STATO_InLavorazione = 15;
        const int STATO_chiuso = 20;
        
        #region IGestioneFasiServices Members

        public void InsertFase(GEP_FASE fase)
        {
            base.DbProvider.DaoImpl.FasePraticaDao.Insert(fase);
        }
        public GEP_FASE getFaseById(decimal FaseId)
        {
            GEP_FASE t=base.DbProvider.DaoImpl.FasePraticaDao.GetById(FaseId);
            return t;
        }

        public Info closeFaseAndPratica( ref GEP_FASE fase)
        {
            Info i = new Info();

            GEP_RISPOSTA resp= base.DbProvider.DaoImpl.RispostaDao.GetById(fase.Fas_cod_pratica);
            if (resp == null || (resp != null && resp.Validated == 0))
            {
                i.AddMessage("Non si può chiudere una pratica senza aver prima inserito una risposta valida!!!",LivelloMessaggio.WARNING);
                return i;
            }


            GEP_FASE old = base.DbProvider.DaoImpl.FasePraticaDao.GetAndLock(fase.Fas_Id);
            if (old.Fas_Stato.Equals("98") || old.Fas_Stato.Equals("99"))
            {
                i.AddMessage("ATTENZIONE: La pratica può soltanto essere letta", LivelloMessaggio.WARNING);
                fase = old;
            }
            else
            {
                old.Fas_Note = fase.Fas_Note;
                old.Gep_ana_statof = new GEP_ANA_STATOF("99");
                old.Fas_Dt_Finelav = System.DateTime.Now;
                base.DbProvider.DaoImpl.FasePraticaDao.Update(old);
                if (old.Fas_Stato.Equals("99"))
                {
                    base.DbProvider.DaoImpl.PraticaDao.updateStatus(old.Fas_cod_pratica, STATO_chiuso);
                }
                //base.DbProvider.EndTransaction(this.GetType());
                fase = old;
            }
            return i;
        }

        public decimal getSiblingFaseID(decimal prtId, decimal currentProgr, bool next)
        {
            if(next)
            return base.DbProvider.DaoImpl.FasePraticaDao.GetByProgr(prtId,currentProgr+1);
            else
            return base.DbProvider.DaoImpl.FasePraticaDao.GetByProgr(prtId, currentProgr - 1);
        }

        public Info closeAndOpen(GEP_FASE oldFase, ref GEP_FASE newFase)
        {
            Info i = new Info();
            oldFase.Fas_Dt_Finelav = System.DateTime.Now;
            newFase.Fas_Dt_Arrivo = oldFase.Fas_Dt_Finelav;
            updateStatoFase(ref oldFase);
            base.DbProvider.DaoImpl.FasePraticaDao.Insert(newFase);
            return i;
        }

        public Info updateAppuntamento(ref GEP_FASE fase)
        {
            Info i = new Info();
            //base.DbProvider.StartTransaction(this.GetType());
            GEP_FASE old = base.DbProvider.DaoImpl.FasePraticaDao.GetAndLock(fase.Fas_Id);
            if (old.Fas_Stato.Equals("98") || old.Fas_Stato.Equals("99"))
            {
               
                i.AddMessage("ATTENZIONE: La pratica può soltanto essere letta", LivelloMessaggio.WARNING);
                fase = old;
            }
            else
            {
                //CONTROLLI FORMALI DELLA DATA
                System.DateTime mindate = old.Fas_Dt_Inilav.Value;
              //  if (fase.Fas_Dtora_App.HasValue && fase.Fas_Dtora_App < mindate)
                //      i.AddMessage("La data dell'appuntamento troppo vecchia", LivelloMessaggio.WARNING);
                //  if (fase.Fas_Dtora_App_Proasm.HasValue && fase.Fas_Dtora_App_Proasm < mindate)
                //    i.AddMessage("La data dell'appuntamento prposta dal Cliente è troppo vecchia", LivelloMessaggio.WARNING);
                //if (fase.Fas_Dtora_App_Procli.HasValue && fase.Fas_Dtora_App_Procli < mindate)
                //    i.AddMessage("Data dell'appuntamento proposta da ASM è troppo vecchia", LivelloMessaggio.WARNING);
                if (i.messageCount() > 0)
                    return i;
                //FINE CONTROLLI FORMALI

                old.Fas_Dtora_App = fase.Fas_Dtora_App;
                old.Fas_Dtora_App_Proasm = fase.Fas_Dtora_App_Proasm;
                old.Fas_Dtora_App_Procli = fase.Fas_Dtora_App_Procli;
                base.DbProvider.DaoImpl.FasePraticaDao.Update(old);
                //base.DbProvider.EndTransaction(this.GetType());
                fase = old;
            }
            return i;
            
        }

        public Info updateStatoFase(ref GEP_FASE fase)
        {
            Info i = new Info();
            //base.DbProvider.StartTransaction(this.GetType());
            GEP_FASE old = base.DbProvider.DaoImpl.FasePraticaDao.GetAndLock(fase.Fas_Id);
            if (old.Fas_Stato.Equals("98") || old.Fas_Stato.Equals("99"))
            {
                i.AddMessage("ATTENZIONE: La pratica può soltanto essere letta", LivelloMessaggio.WARNING);
                fase = old;
            }
            else
            {
                old.Fas_Note = fase.Fas_Note;
                if(old.Fas_Stato.Equals("1") && fase.Fas_Stato.Equals("2"))
                    old.Fas_Dt_Inilav = System.DateTime.Now;
                if (old.Fas_Stato.Equals("2"))
                {
                    base.DbProvider.DaoImpl.PraticaDao.updateStatus(old.Fas_cod_pratica, STATO_InLavorazione);
                }
                old.Gep_ana_statof = fase.Gep_ana_statof;

                //se il nuovo stato è di chiusura metto anche i motivi di chiusura e la data di chiusura
                if (fase.Fas_Stato.Equals("98") || fase.Fas_Stato.Equals("99"))
                {
                    old.Gep_ana_motstafase_chiusura.Id_mfa_cod_motiv = fase.Fas_Motivaz_Chiusura;
                    old.Fas_Dt_Finelav = fase.Fas_Dt_Finelav;
                }
                base.DbProvider.DaoImpl.FasePraticaDao.Update(old);
                //base.DbProvider.EndTransaction(this.GetType());
                fase = old;
            }
            return i;
        }

        public Info updateRichiestaDocumentaizoneFase(ref GEP_FASE fase)
        {
            Info i = new Info();
            //base.DbProvider.StartTransaction(this.GetType());
            GEP_FASE old = base.DbProvider.DaoImpl.FasePraticaDao.GetAndLock(fase.Fas_Id);
            if (old.Fas_Stato.Equals("98") || old.Fas_Stato.Equals("99"))
            {
                i = new Info();
                i.AddMessage("ATTENZIONE: La pratica può soltanto essere letta", LivelloMessaggio.WARNING);
                fase = old;
            }
            else
            {
                //CONTROLLI FORMALI DELLA DATA
                //System.DateTime mindate = old.Fas_Dt_Inilav.Value;
                //if (fase.Fas_Dt_Atto_Rich.HasValue && fase.Fas_Dt_Atto_Rich < mindate)
                //    i.AddMessage("La data di richiesta dei docuemnti è troppo vecchia", LivelloMessaggio.WARNING);
                //if (fase.Fas_Dt_Atto_Ott.HasValue)
                //{
                //    if (!fase.Fas_Dt_Atto_Rich.HasValue)
                //        i.AddMessage("Non si può inserire la data di ottenimento dei documenti senza aver inserito quella di richiesta", LivelloMessaggio.WARNING);
                //    else if (fase.Fas_Dt_Atto_Ott < fase.Fas_Dt_Atto_Rich.Value)
                //        i.AddMessage("La data di ottenimento dei documenti deve essere posteriore a quella della loro richiesta", LivelloMessaggio.WARNING);
                //}
                //if (i.messageCount() > 0)
                //return i;
                //FINE CONTROLLI FORMALI


                old.Fas_Dt_Atto_Rich = fase.Fas_Dt_Atto_Rich;
                old.Fas_Dt_Atto_Ott = fase.Fas_Dt_Atto_Ott;
                base.DbProvider.DaoImpl.FasePraticaDao.Update(old);
                //base.DbProvider.EndTransaction(this.GetType());
                fase = old;
            }
            return i;
        }

        public Info updateSospensioneFase(ref GEP_FASE fase)
        {
            Info i = new Info();
            base.DbProvider.StartTransaction(this.GetType());
            GEP_FASE old = base.DbProvider.DaoImpl.FasePraticaDao.GetAndLock(fase.Fas_Id);
            if (old.Fas_Stato.Equals("98") || old.Fas_Stato.Equals("99"))
            {
                i = new Info();
                i.AddMessage("ATTENZIONE: La pratica può soltanto essere letta", LivelloMessaggio.WARNING);
                fase = old;
            }
            else
            {
                //CONTROLLI FORMALI DELLA DATA
                //System.DateTime mindate = old.Fas_Dt_Inilav.Value;
                //if (fase.Fas_Dt_Inisosp.HasValue && fase.Fas_Dt_Inisosp < mindate)
                //    i.AddMessage("La data di inizio sospensione è troppo vecchia", LivelloMessaggio.WARNING);
                //if (fase.Fas_Dt_Finesosp.HasValue)
                //{
                //    if (!fase.Fas_Dt_Inisosp.HasValue)
                //        i.AddMessage("Non si può inserire la data di fine sospensione senza aver inserito quella di inizio", LivelloMessaggio.WARNING);
                //    else if (fase.Fas_Dt_Finesosp.Value < fase.Fas_Dt_Inisosp.Value)
                //        i.AddMessage("La data di fine sospensione deve essere posteriore a quella di inizio", LivelloMessaggio.WARNING);
                //}
                if (i.messageCount() > 0)
                {
                    base.DbProvider.RollBackTransaction(this.GetType());
                    return i;
                }

                //FINE CONTROLLI FORMALI
                old.Fas_Dt_Inisosp = fase.Fas_Dt_Inisosp;
                old.Fas_Dt_Finesosp = fase.Fas_Dt_Finesosp;
                old.Gep_ana_motstafase = fase.Gep_ana_motstafase;
                base.DbProvider.DaoImpl.FasePraticaDao.Update(old);
                base.DbProvider.EndTransaction(this.GetType());
                fase = old;
            }
            return i;
        }

        public Info document_Upload(GEP_FASE.GEP_BLOB document)
        {
            Info i= new Info();
            base.DbProvider.DaoImpl.DocumentoDao.Insert(document);
            return i;
        }
        
        public Info document_delete(decimal id)
        {
            Info i = new Info();
            base.DbProvider.DaoImpl.DocumentoDao.Delete(id);
            return i;
        }
        
        public GEP_FASE.GEP_BLOB document_load(decimal id)
        {
            GEP_FASE.GEP_BLOB t = base.DbProvider.DaoImpl.DocumentoDao.GetById(id);
            return t;
        }

        #endregion
    }
}